//package com.share.payment.service.impl;
//
//import com.alibaba.fastjson2.JSON;
//import com.share.common.core.domain.R;
//import com.share.common.core.exception.ServiceException;
//import com.share.common.core.utils.StringUtils;
//import com.share.common.security.utils.SecurityUtils;
//import com.share.payment.config.WxPayV3Properties;
//import com.share.payment.domain.CreateWxPaymentForm;
//import com.share.payment.domain.PaymentInfo;
//import com.share.payment.domain.WxPrepayVo;
//import com.share.payment.service.IWxPayService;
//import com.share.payment.service.PaymentService;
//import com.share.payment.utils.RequestUtils;
//import com.share.user.api.RemoteUserService;
//import com.share.user.domain.UserInfo;
//import com.wechat.pay.java.core.RSAAutoCertificateConfig;
//import com.wechat.pay.java.core.notification.NotificationParser;
//import com.wechat.pay.java.core.notification.RequestParam;
//import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
//import com.wechat.pay.java.service.payments.jsapi.model.*;
//import com.wechat.pay.java.service.payments.model.Transaction;
//import jakarta.servlet.http.HttpServletRequest;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.stereotype.Service;
//
//import java.math.BigDecimal;
//
//@Service
//@Slf4j
//@RequiredArgsConstructor
//public class WxPayServiceImplBackup implements IWxPayService {
//
//    private final PaymentService paymentService;
//    private final RSAAutoCertificateConfig rsaAutoCertificateConfig;
//    private final WxPayV3Properties wxPayV3Properties;
//    private final RemoteUserService remoteUserService;
//
//    //微信下单
//    public WxPrepayVo createWxPayment(CreateWxPaymentForm createWxPaymentForm) {
//        String orderNo = createWxPaymentForm.getOrderNo();
//        Long userId = SecurityUtils.getUserId();
//
//        log.info("开始微信支付下单，订单号：{}, 用户ID：{}", orderNo, userId);
//
//        try {
//            PaymentInfo paymentInfo = paymentService.savePaymentInfo(orderNo);
//            JsapiServiceExtension service = new JsapiServiceExtension.Builder()
//                    .config(rsaAutoCertificateConfig)
//                    .build();
//
//            PrepayRequest request = buildPrepayRequest(paymentInfo);
//            PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
//
//            log.info("微信支付下单成功，订单号：{}", orderNo);
//            log.debug("微信支付返回详情 - appId: {}, timeStamp: {}, nonceStr: {}, package: {}, signType: {}, paySign: {}",
//                    response.getAppId(),
//                    response.getTimeStamp(),
//                    response.getNonceStr(),
//                    response.getPackageVal(),
//                    response.getSignType(),
//                    response.getPaySign());
//
//            return convertToWxPrepayVo(response);
//
//        } catch (ServiceException e) {
//            log.error("微信支付业务异常 - 订单号: {}, 错误码: {}, 错误信息: {}",
//                    orderNo, e.getCode(), e.getDetailMessage(), e);
//            throw e;
//        } catch (IllegalArgumentException e) {
//            log.error("参数校验异常 - 订单号: {}, 错误信息: {}", orderNo, e.getMessage(), e);
//            throw new ServiceException("订单参数异常");
//        } catch (Exception e) {
//            log.error("微信下单系统异常 - 订单号: {}, 异常类型: {}", orderNo, e.getClass().getSimpleName(), e);
//            throw new ServiceException("微信支付系统繁忙，请稍后重试");
//        }
//    }
//
//    @Override
//    public void wxnotify(HttpServletRequest request) {
//        String wechatPaySerial = request.getHeader("Wechatpay-Serial");
//        String nonce = request.getHeader("Wechatpay-Nonce");
//        String timestamp = request.getHeader("Wechatpay-Timestamp");
//        String signature = request.getHeader("Wechatpay-Signature");
//        String requestBody = RequestUtils.readData(request);
//
//        //2.构造 RequestParam
//        RequestParam requestParam = new RequestParam.Builder()
//                .serialNumber(wechatPaySerial)
//                .nonce(nonce)
//                .signature(signature)
//                .timestamp(timestamp)
//                .body(requestBody)
//                .build();
//
//        //3.初始化 NotificationParser
//        NotificationParser parser = new NotificationParser(rsaAutoCertificateConfig);
//        //4.以支付通知回调为例，验签、解密并转换成 Transaction
//        Transaction transaction = parser.parse(requestParam, Transaction.class);
//        if (null != transaction &&
//                transaction.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
//            //5.处理支付业务
//            paymentService.updatePaymentStatus(transaction);
//        }
//    }
//
//    //根据订单编号调用微信服务接口，查询支付相关状态信息
//    @Override
//    public Transaction queryPayStatus(String orderNo) {
//        log.info("开始查询微信支付状态，订单号：{}", orderNo);
//
//        try {
//            Transaction result = executeQuery(orderNo);
//            handleQueryResult(orderNo, result);
//            return result;
//
//        } catch (ServiceException e) {
//            log.error("微信支付查询业务异常，订单号：{}, 错误码：{}, 错误信息：{}",
//                    orderNo, e.getCode(), e.getDetailMessage(), e);
//            throw new ServiceException("查询支付状态失败：" + e.getDetailMessage());
//
//        } catch (Exception e) {
//            log.error("微信支付查询系统异常，订单号：{}, 异常类型：{}",
//                    orderNo, e.getClass().getSimpleName(), e);
//            throw new ServiceException("支付查询系统异常，请稍后重试");
//        }
//    }
//
//    /**
//     * 执行微信支付查询
//     */
//    private Transaction executeQuery(String orderNo) {
//        JsapiServiceExtension service = new JsapiServiceExtension.Builder()
//                .config(rsaAutoCertificateConfig)
//                .build();
//
//        QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest();
//        queryRequest.setMchid(wxPayV3Properties.getMerchantId());
//        queryRequest.setOutTradeNo(orderNo);
//
//        return service.queryOrderByOutTradeNo(queryRequest);
//    }
//
//    /**
//     * 处理查询结果
//     */
//    private void handleQueryResult(String orderNo, Transaction result) {
//        if (result == null) {
//            log.warn("微信支付查询返回空结果，订单号：{}", orderNo);
//            return;
//        }
//
//        log.info("微信支付查询成功，订单号：{}, 交易状态：{}, 金额：{}分",
//                orderNo, result.getTradeState(), result.getAmount().getTotal());
//
//        if (log.isDebugEnabled()) {
//            log.debug("微信支付查询详情，订单号：{}, 响应：{}", orderNo, JSON.toJSONString(result));
//        }
//
//        // 根据交易状态进行不同的业务处理
//        switch (result.getTradeState()) {
//            case SUCCESS:
//                log.info("订单支付成功，订单号：{}", orderNo);
//                break;
//            case REFUND:
//                log.info("订单已退款，订单号：{}", orderNo);
//                break;
//            case CLOSED:
//                log.info("订单已关闭，订单号：{}", orderNo);
//                break;
//            case NOTPAY:
//                log.info("订单未支付，订单号：{}", orderNo);
//                break;
//            default:
//                log.info("订单状态：{}，订单号：{}", result.getTradeState(), orderNo);
//        }
//    }
//
//    // 构建支付请求参数
//    private PrepayRequest buildPrepayRequest(PaymentInfo paymentInfo) {
//        PrepayRequest request = new PrepayRequest();
//
//        Amount amount = new Amount();
//        amount.setTotal(paymentInfo.getAmount()
//                .multiply(new BigDecimal(100))
//                .intValue()
//        );
//        request.setAmount(amount);
//
//        request.setAppid(wxPayV3Properties.getAppid());
//        request.setMchid(wxPayV3Properties.getMerchantId());
//        request.setDescription(paymentInfo.getContent());
//        request.setNotifyUrl(wxPayV3Properties.getNotifyUrl());
//        request.setOutTradeNo(paymentInfo.getOrderNo());
//
//        // 获取用户openid
//        String openid = getUserOpenId(paymentInfo.getUserId());
//        Payer payer = new Payer();
//        payer.setOpenid(openid);
//        request.setPayer(payer);
//
//        return request;
//    }
//
//    // 获取用户openid
//    private String getUserOpenId(Long userId) {
//        R<UserInfo> userInfoR = remoteUserService.getInfo(userId);
//        if (StringUtils.isNull(userInfoR) || StringUtils.isNull(userInfoR.getData())) {
//            throw new ServiceException("获取用户信息失败");
//        }
//        if (R.FAIL == userInfoR.getCode()) {
//            throw new ServiceException(userInfoR.getMsg());
//        }
//        return userInfoR.getData().getWxOpenId();
//    }
//
//    // 转换响应对象
//    private WxPrepayVo convertToWxPrepayVo(PrepayWithRequestPaymentResponse response) {
//        WxPrepayVo wxPrepayVo = new WxPrepayVo();
//        BeanUtils.copyProperties(response, wxPrepayVo);
//        wxPrepayVo.setTimeStamp(response.getTimeStamp());
//        return wxPrepayVo;
//    }
//}
